2448

2448

Created at : 2024-01-17 16:52
2448

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

void DrawStar11(int n, int h);

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n;

    for(int i = 0; i < n; ++i)
    {
        DrawStar11(n, i);
        for(int j = 0; j < n - i; ++j) 
            cout << ' ';
        if(i != n - 1)
        {
            cout << '\n';
        }
    }

    return 0;
}

void DrawStar11(int n, int h)
{
    
    if(n == 1)
    {
        if(h == 0)
        {
            cout << "*";
        }
        else if(h == 1)
        {
            cout << "* *";
        }
        else if(h == 2)
        {
            cout << "*****";
        }
        return;
    }
    
    int Blank;
    if(h < 3)
    {
        Blank = n - h - 1;
        for(int i = 0; i < Blank; ++i)
        {
            cout << ' ';
        }
        DrawStar11(1, h);
        return;
    }

    int k = log2(h / 3);
    int NextN = 3 * pow(2, k);
    int NextH = h - 3 * pow(2, k);
    Blank = n - NextN * 2;
    for(int i = 0; i < Blank; ++i)
    {
        cout << ' ';
    }
    DrawStar11(NextN, NextH);
    int pow2k = pow(2, k);
    Blank = 6 * pow2k - 1;
    Blank /= 2;
    Blank -= (NextH - 1);
    for(int i = 0; i < Blank; ++i)
    {
        cout << ' ';
    }
    DrawStar11(NextN, NextH);
}

내가 재귀를 엄청 못한다는 것은 깨달았다.

다른 버전

#include <iostream>
#include <vector>
#include <cmath>


using namespace std;

void DrawStar11(int n, pair<int, int> Start, vector<vector<char>>& Stars);

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k, m;
    vector<vector<char>> Stars;
    cin >> n;
    k = log2(n / 3);
    m = 6 * pow(2, k) - 1;
    Stars.resize(n);
    for(int i = 0; i < n; ++i)
    {
        Stars[i].resize(m);
        for(int j = 0; j < m; ++j)
        {
            Stars[i][j] = ' ';
        }
    }

    DrawStar11(n, {Stars.size() - 1, 0}, Stars);

    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            cout << Stars[i][j];
        }
        cout << '\n';
    }

    return 0;
}

void DrawStar11(int n, pair<int, int> Start, vector<vector<char>>& Stars)
{
    if(n < 3)
    {
        return;
    }
    int k = log2(n / 3);
    int m = 6 * pow(2, k) - 1;
    int i = Start.first, j = Start.second, Cnt = 0;
    while(true)
    {
        if(Cnt == m)
        {
            break;
        }

        if(Cnt % 6 != 5)
        {
            Stars[Start.first][j] = '*';
        }
        Stars[i][j] = '*';

        ++Cnt;
        i = Cnt > m / 2 ? i + 1 : i - 1;
        ++j;
    }

    DrawStar11(n / 2,Start , Stars);
    DrawStar11(n / 2,{Start.first, Start.second + m / 2 + 1} , Stars);
    DrawStar11(n / 2,{Start.first - n / 2, Start.second + m / 4 + 1} , Stars);
}

아무리 생각해도 내가 생각한건 직관적이지 않았기에, 인터넷을 뒤적여보니 다들 공통적으로 배열을 선언하고 배열을 채우는 식으로 했다. 메모리는 더 사용 하지만 훨씬 직관적이다.

유형

재귀